package com.xukang.batch.service;


import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 流程任务服务
 */
@Service
public class ProcessTaskService {

    @Autowired
    private TaskService taskService;
    @Autowired
    private RuntimeService runtimeService;


    /**
     * 查询指定用户的待办任务
     */
    public List<Task> getTasksByAssignee(String assignee) {
        return taskService.createTaskQuery()
                .taskAssignee(assignee)      // 指定任务负责人
                .active()                   // 只查询活跃任务
                .orderByTaskCreateTime()    // 按创建时间排序
                .desc()
                .list();
    }
    /**
     * 查询用户可认领的待办任务
     */
    public List<Task> getCandidateTasks(String candidateUser) {
        return taskService.createTaskQuery()
                .taskCandidateUser(candidateUser)  // 指定候选用户
                .active()
                .list();
    }


    /**
     * 完成任务（审批通过）
     */
    public void completeTask(String taskId, String assignee, String comment, Map<String, Object> variables) {
        // 1. 先认领任务（如果尚未认领）
        taskService.claim(taskId, assignee);

        // 2. 添加审批意见
        taskService.addComment(taskId, null, comment);

        // 3. 设置审批结果变量（如 "approved": true）
        taskService.setVariables(taskId, variables);

        // 4. 完成任务
        taskService.complete(taskId, variables);

        System.out.println("任务 " + taskId + " 已被用户 " + assignee + " 完成");
    }

    /**
     * 驳回任务到指定节点
     */
    public void rejectTask(String taskId, String assignee, String targetActivityId, String comment) {
        // 1. 认领任务
        taskService.claim(taskId, assignee);

        // 2. 添加驳回意见
        taskService.addComment(taskId, null, comment);

        // 3. 获取当前流程实例
        String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();

        // 4. 使用 BPMN API 实现驳回（需自定义）
        moveExecutionToActivity(processInstanceId, targetActivityId);

        System.out.println("任务 " + taskId + " 已被用户 " + assignee + " 驳回至节点: " + targetActivityId);
    }

    /**
     * 将执行实例移动到指定活动节点（需自定义实现）
     */
    private void moveExecutionToActivity(String processInstanceId, String targetActivityId) {
        // 实现方式有多种，例如：
        // 1. 使用 ExecutionEntityManager（需注入）
        // 2. 使用流程实例 ID 和目标节点 ID 创建新执行路径
        // 3. 推荐使用官方支持的 API（如 createChangeActivityStateBuilder）

        // 示例代码（需根据具体版本调整）：

    }

    /**
     * 转办任务给其他用户
     */
    public void transferTask(String taskId, String assignee, String newAssignee, String comment) {
        // 1. 认领任务（如果尚未认领）
        taskService.claim(taskId, assignee);

        // 2. 添加转办意见
        taskService.addComment(taskId, null, comment);

        // 3. 转办任务
        taskService.setAssignee(taskId, newAssignee);

        System.out.println("任务 " + taskId + " 已被用户 " + assignee + " 转办给 " + newAssignee);
    }
}
